﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpDevService.h"

#include <string>


namespace gcmp
{

// 应用程序级别错误码。
enum ErrorCodes
{
    Ok = 0, // 没有错误。
    GenericErrorCode, // 通用错误。
    BadApiCallErrorCode, // API输入参数错误。在API层检查。
    UserFriendlyErrorCode // 用户友好的错误提示。消息内容可以在消息对话框显示。
};

class Error
{
public:
    GCMP_DEV_SERVICE_EXPORT static const Error* GetLastError();
    int GetCode() const { return m_errorCode; }
    const std::wstring& GetErrorMessage() const { return m_errorMsg; }

public:
    Error(const Error& src) : m_errorCode(src.m_errorCode), m_errorMsg(src.m_errorMsg) {}

    GCMP_DEV_SERVICE_EXPORT static int GetLastErrorCode();
    GCMP_DEV_SERVICE_EXPORT static bool SetLastError(int errorCode, const std::wstring& errorMsg);
    GCMP_DEV_SERVICE_EXPORT static void ClearLastError();

    GCMP_DEV_SERVICE_EXPORT static bool EnableDebugWarning();
    GCMP_DEV_SERVICE_EXPORT static void SetEnableDebugWarning(bool value);

private:
    Error(int errorCode, const std::wstring& errorMsg);

    int m_errorCode;
    std::wstring m_errorMsg;
};

}

// 报告通用错误，消息内容不需要本地化。
#define REPORT_GENERIC_ERROR(errorMsg) gcmp::Error::SetLastError(gcmp::GenericErrorCode, errorMsg)

// 报告用户友好的错误，消息内容可以在消息对话框显示，需要本地化。
#define REPORT_USER_FRIENDLY_ERROR(errorMsg) gcmp::Error::SetLastError(gcmp::UserFriendlyErrorCode, errorMsg)
